package com.ce.framework.datamaintain.action;

import java.io.File;
import java.util.List;

import com.ce.cases.report.logic.IReportIllegalLogic;
import net.sf.json.JSONArray;

import org.apache.poi2.hssf.usermodel.HSSFWorkbook;

import com.ce.framework.constants.WebConstants;
import com.ce.framework.context.FrameworkContext;
import com.ce.framework.datamaintain.logic.AdvSearchCond;
import com.ce.framework.datamaintain.logic.DivideInfo;
import com.ce.framework.datamaintain.logic.IBaseLogic;
import com.ce.framework.datamaintain.logic.ISearchCondition;
import com.ce.framework.datamaintain.logic.ISearchInfo;
import com.ce.framework.datamaintain.logic.SearchInfo;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.BeanAccessUtil;
import com.ce.framework.util.LogUtil;

public abstract class SearchAction extends BaseAction {
	private static final long serialVersionUID = 1L;

	public static String JSON = "jsonSearchList";
	
	/**
	 * 基本逻辑处理类
	 */
	protected IBaseLogic baselogic ;

	protected ISearchCondition search;



	/*
 * 使用js框架分页时进行排序的必要属性
 */
	protected String order;   //排序方法
	protected String sort;  //排序字段
	//如果配置html=true，则直接查询数据并显示，否则只显示查询列表界面，数据通过Ajax加载
	protected boolean html;

	protected boolean m;//是否以手机网页形式展示的标记，默认为false

	/**
	 * 请求的参数，为"open"时打开添加或修改页面，为"save"时是正常保存操作，为"savejs"时是采用AJAX保存，默认为打开
	 */
	protected String op;

    /**
     * 用js框架进行表格展示的必要属性，存放查询到的数据集
     */
	protected List<?> rows;
    /**
     * 用js框架进行表格展示的必要属性，存放查询到的数据记录总数
     */
	protected int total;
	
	/**
	 * 用js框架进行表格展示的非必要属性，存放查询的统计数据
	 */
	protected List<Object> footer;
	
	protected String excelSrc;
	


	public String execute() throws Exception
	{
		System.out.println("1 进来了………………+++++++++++++++++++++++++++SearchAction.execute()"+util.time.time.getYyyy_MM_dd_HH_mm_ss());
		if("search".equals(op))
		{     //有分页查询
			return this.searchData();
		}
		else if("searchjs".equals(op))
		{  //有分页查询json
			System.out.println("2 +++++++++++++++++++++++++++SearchAction.execute()-"+"searchjs".equals(op)+"    "+util.time.time.getYyyy_MM_dd_HH_mm_ss());
			return this.searchDataJs();
		}
		else if("searchNoPageing".equals(op))
		{  //无分页查询
			return this.searchNoDataDivideInfo();
		}
		else if("searchNoPageingjs".equals(op))
		{  //无分页查询json
			return this.searchNoDataDivideInfoJs();
		}
		else if("loadSrhConds".equals(op))
		{  //获取高级查询的JSON
			return this.loadSrhConds();

		}
		else
		{//如果配置html=true，则直接查询数据并显示，否则只显示查询列表界面，数据通过Ajax加载
			return html?searchData():list();
		}
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-10-20  下午01:55:17
	* 功能描述: 查询列表界面，但不查询数据
	* 方法的参数和返回值: 
	* @return
	* @throws AppException
	*/
	public String list()throws AppException{
		if (search != null)
			this.search.initCondition(this, false);
		return SUCCESS;
	}

	/**
	 * 开发人： andy
	 * 开发时间： Jul 7, 2010 4:06:36 PM
	 * 功能描述：打开查询界面（有分页）
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	protected String searchData()throws AppException{
		if(this.search!=null)
		   BeanAccessUtil.copyBeanProperties(this.search,this);
		this.search.initCondition(this,true);
		this.getDivedeSearchResult(search);
		if(this.m)
			return WebConstants.REQUEST_SEARCHDATA_OPERATOR_MOBILE;
		return SUCCESS;
	}
	
	/**
	 * 开发人： andy
	 * 开发时间： 2013-7-27 上午09:15:48
	 * 功能描述：打开查询界面(无分页)
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	protected String searchNoDataDivideInfo()throws AppException{
		if(this.search!=null)
			   BeanAccessUtil.copyBeanProperties(this.search,this);
			this.search.initCondition(this,true);
			this.getNoDivedeSearchResult(search);
			return SUCCESS;
    }
	/**
	 * 开发人： andy
	 * 开发时间： Aug 24, 2010 9:44:02 AM
	 * 功能描述： 根据查询条件获取查询数据，并附加分页信息
	 * 方法的参数和返回值
	 * @param searchCondition
	 * @throws AppException
	 * void 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	@SuppressWarnings("deprecation")
	protected void getDivedeSearchResult(ISearchCondition searchCondition)throws AppException
	{
		if(searchCondition!=null)
		{
			ISearchInfo searchInfo = new SearchInfo();

			// 得到分页信息
			DivideInfo divideInfo = DivideInfo.getNewInstance(this.getRequest());

			// 分页信息存入session
			this.getRequest().getSession().setAttribute(WebConstants.LAST_DIVIDE_PAGE_INFO,divideInfo.clone());
			searchInfo.setDivideInfo(divideInfo);
			searchInfo.setSearchCondition(searchCondition);

			// 数据信息+***********************   搞你妈	这么多，就这一句话主要起作用 	***********************//
			//
						List<?> list = baselogic.getSearchResult(searchInfo);

			setAttribute(WebConstants.SEARCH_RESULT_DATA, list);
			// 分页信息。
			setAttribute(WebConstants.SEARCH_RESULT_DIVID_INFO, divideInfo);	
		}
	}
	
    /**
     * 开发人： andy
     * 开发时间： Aug 24, 2010 9:44:26 AM
     * 功能描述：根据查询条件获取查询数据，不包含分页信息
     * 方法的参数和返回值
     * @param searchCondition
     * @throws AppException
     * void 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
	protected void getNoDivedeSearchResult(ISearchCondition searchCondition)throws AppException{
		List<?> searchResult = baselogic.getSearchResult(searchCondition);
		setAttribute(WebConstants.SEARCH_RESULT_DATA, searchResult);
	}

	/**
	 * 开发人： andy
	 * 开发时间： 2013-10-08 15:56:47
	 * 功能描述：用js框架进行表格展示时获取的数据Action，返回类型为json格式（又分页）
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
    protected String searchDataJs()throws AppException
	{
		System.out.println("3 +++++++++++++++++++++++++++SearchAction.searchDataJs()"+util.time.time.getYyyy_MM_dd_HH_mm_ss());

		  this.searchData();
          DivideInfo result = (DivideInfo)getAttribute(WebConstants.SEARCH_RESULT_DIVID_INFO);

          this.rows = (List<?>)getAttribute(WebConstants.SEARCH_RESULT_DATA);
          this.total =  result.getRowAmount();
      return JSON;
    }
    
    /**
     * 开发人： andy
     * 开发时间： 2013-7-27 上午09:11:12
     * 功能描述：用js框架进行表格展示时获取的数据Action，返回类型为json格式(无分页)
     * 方法的参数和返回值
     * @return
     * @throws AppException
     * String 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    protected String searchNoDataDivideInfoJs()throws AppException
	{
        this.searchNoDataDivideInfo();
        this.rows = (List<?>)getAttribute(WebConstants.SEARCH_RESULT_DATA);
        this.total =  rows.size();
    return JSON;
  }

    protected File getExcelTemplate() throws AppException{
		if(excelSrc==null){
			excelSrc = "export.xls";
		}
		if(!excelSrc.startsWith("/")&&!excelSrc.startsWith("\\")){
			String uri = getRequest().getRequestURI();
			uri = uri.substring(FrameworkContext.path.length(),uri.lastIndexOf("/"));
			excelSrc = uri+"/"+excelSrc;
		}
		File f = new File(FrameworkContext.getAppPath()+excelSrc);
		if(!f.exists()){
			throw new AppException("Excel模板["+f.getAbsolutePath().replaceAll("\\\\", "/")+"]不存在!");
		}
		return f;
    }

	/**
	 * 开发人： andy
	 * 开发时间： 2012-3-10 下午5:39:50
	 * 功能描述：通过设定的Excel模板文件导出数据为Excel格式
	 * 方法的参数和返回值
	 * @return
	 * String 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	public String saExcel() {
		try {
			File f = getExcelTemplate();
			search.initCondition(this, true);
			HSSFWorkbook wb = baselogic.genExcel(search,f);
			getResponse().setCharacterEncoding("UTF-8");
			//String tt=new String(fileName.getBytes("iso8859-1"),"GBK");
			getResponse().setContentType("application/zip"); // MIME type for pdf doc
			getResponse().setHeader("Content-disposition", "attachment; filename=\""
					+ new String((search.getExcelName()+".xls").getBytes("GBK"),"ISO8859-1") + "\"");
			wb.write(getResponse().getOutputStream());
		} catch (Exception e) {
			LogUtil.logError(e);
			return this.alertMsg(e.getMessage());
		}
		return NONE;
	}


    public List<?> getRows() {
      return rows;
    }

    public int getTotal() {
      return total;
    }

	public void setBaselogic(IBaseLogic baselogic) {
		this.baselogic = baselogic;
	}

	public String getOp() {
		return op;
	}

	public void setOp(String op) {
		this.op = op;
	}

	public String getOrder() {
		return order;
	}

	public void setOrder(String order) {
		this.order = order;
	}

	public String getSort() {
		return sort;
	}

	public void setSort(String sort) {
		this.sort = sort;
	}

	public void setSearch(ISearchCondition search) {
		this.search = search;
	}

	public ISearchCondition getSearch() {
		return search;
	}


    /**
     * @author ： andy
     * @since： Oct 31, 2011 1:22:05 PM
     * 功能描述： 用于形成查询列表页的底部统计信息，使用该方法时重写即可，
     *          页面中调用时需要在datagrid属性中增加  showFooter:true  参数
     * 方法的参数和返回值
     * @return
     * List<Object> 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    public List<Object> getFooter() {
        /*
         * 建立一个统计的View对象，并将该对象的统计信息赋值，插入到一个list对象中返回，示例代码如下
         * List footList = new ArrayList();
         * FooterObj obj = new FooterObj();
         * obj.setXXX();
         * footList.add(obj);
         * return footList;
         */
        return footer;
    }


    public void setFooter(List<Object> footer) {
        this.footer = footer;
    }

    public String loadSrhConds(){
    	JSONArray ary = new JSONArray();
//    	ary.add(new AdvSearchCond("主键","t.vc_id","text"));
    	return writeHTML(ary.toString());
    }

	public boolean isHtml() {
		return html;
	}
	public void setHtml(boolean html) {
		this.html = html;
	}
	public String getExcelSrc() {
		return excelSrc;
	}
	public void setExcelSrc(String excelSrc) {
		this.excelSrc = excelSrc;
	}

	public boolean isM() {
		return m;
	}

	public void setM(boolean m) {
		this.m = m;
	}

}
